home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / glibc108.zip / glibc108 / sunrpc / xdr_stdio.c < prev    next >
C/C++ Source or Header  |  1994-02-06  |  5KB  |  190 lines

  1. /* @(#)xdr_stdio.c    2.1 88/07/29 4.0 RPCSRC */
  2. /*
  3.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  4.  * unrestricted use provided that this legend is included on all tape
  5.  * media and as a part of the software program in whole or part.  Users
  6.  * may copy or modify Sun RPC without charge, but are not authorized
  7.  * to license or distribute it to anyone else except as part of a product or
  8.  * program developed by the user.
  9.  * 
  10.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  11.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  12.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  13.  * 
  14.  * Sun RPC is provided with no support and without any obligation on the
  15.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  16.  * modification or enhancement.
  17.  * 
  18.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  19.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  20.  * OR ANY PART THEREOF.
  21.  * 
  22.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  23.  * or profits or other special, indirect and consequential damages, even if
  24.  * Sun has been advised of the possibility of such damages.
  25.  * 
  26.  * Sun Microsystems, Inc.
  27.  * 2550 Garcia Avenue
  28.  * Mountain View, California  94043
  29.  */
  30. #if !defined(lint) && defined(SCCSIDS)
  31. static char sccsid[] = "@(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro";
  32. #endif
  33.  
  34. /*
  35.  * xdr_stdio.c, XDR implementation on standard i/o file.
  36.  *
  37.  * Copyright (C) 1984, Sun Microsystems, Inc.
  38.  *
  39.  * This set of routines implements a XDR on a stdio stream.
  40.  * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes
  41.  * from the stream.
  42.  */
  43.  
  44. #include <rpc/types.h>
  45. #include <stdio.h>
  46. #include <rpc/xdr.h>
  47.  
  48. static bool_t    xdrstdio_getlong();
  49. static bool_t    xdrstdio_putlong();
  50. static bool_t    xdrstdio_getbytes();
  51. static bool_t    xdrstdio_putbytes();
  52. static u_int    xdrstdio_getpos();
  53. static bool_t    xdrstdio_setpos();
  54. static long *    xdrstdio_inline();
  55. static void    xdrstdio_destroy();
  56.  
  57. /*
  58.  * Ops vector for stdio type XDR
  59.  */
  60. static struct xdr_ops    xdrstdio_ops = {
  61.     xdrstdio_getlong,    /* deseraialize a long int */
  62.     xdrstdio_putlong,    /* seraialize a long int */
  63.     xdrstdio_getbytes,    /* deserialize counted bytes */
  64.     xdrstdio_putbytes,    /* serialize counted bytes */
  65.     xdrstdio_getpos,    /* get offset in the stream */
  66.     xdrstdio_setpos,    /* set offset in the stream */
  67.     xdrstdio_inline,    /* prime stream for inline macros */
  68.     xdrstdio_destroy    /* destroy stream */
  69. };
  70.  
  71. /*
  72.  * Initialize a stdio xdr stream.
  73.  * Sets the xdr stream handle xdrs for use on the stream file.
  74.  * Operation flag is set to op.
  75.  */
  76. void
  77. xdrstdio_create(xdrs, file, op)
  78.     register XDR *xdrs;
  79.     FILE *file;
  80.     enum xdr_op op;
  81. {
  82.  
  83.     xdrs->x_op = op;
  84.     xdrs->x_ops = &xdrstdio_ops;
  85.     xdrs->x_private = (caddr_t)file;
  86.     xdrs->x_handy = 0;
  87.     xdrs->x_base = 0;
  88. }
  89.  
  90. /*
  91.  * Destroy a stdio xdr stream.
  92.  * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
  93.  */
  94. static void
  95. xdrstdio_destroy(xdrs)
  96.     register XDR *xdrs;
  97. {
  98.     (void)fflush((FILE *)xdrs->x_private);
  99.     /* xx should we close the file ?? */
  100. };
  101.  
  102. static bool_t
  103. xdrstdio_getlong(xdrs, lp)
  104.     XDR *xdrs;
  105.     register long *lp;
  106. {
  107.  
  108.     if (fread((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
  109.         return (FALSE);
  110. #ifndef mc68000
  111.     *lp = ntohl(*lp);
  112. #endif
  113.     return (TRUE);
  114. }
  115.  
  116. static bool_t
  117. xdrstdio_putlong(xdrs, lp)
  118.     XDR *xdrs;
  119.     long *lp;
  120. {
  121.  
  122. #ifndef mc68000
  123.     long mycopy = htonl(*lp);
  124.     lp = &mycopy;
  125. #endif
  126.     if (fwrite((caddr_t)lp, sizeof(long), 1, (FILE *)xdrs->x_private) != 1)
  127.         return (FALSE);
  128.     return (TRUE);
  129. }
  130.  
  131. static bool_t
  132. xdrstdio_getbytes(xdrs, addr, len)
  133.     XDR *xdrs;
  134.     caddr_t addr;
  135.     u_int len;
  136. {
  137.  
  138.     if ((len != 0) && (fread(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
  139.         return (FALSE);
  140.     return (TRUE);
  141. }
  142.  
  143. static bool_t
  144. xdrstdio_putbytes(xdrs, addr, len)
  145.     XDR *xdrs;
  146.     caddr_t addr;
  147.     u_int len;
  148. {
  149.  
  150.     if ((len != 0) && (fwrite(addr, (int)len, 1, (FILE *)xdrs->x_private) != 1))
  151.         return (FALSE);
  152.     return (TRUE);
  153. }
  154.  
  155. static u_int
  156. xdrstdio_getpos(xdrs)
  157.     XDR *xdrs;
  158. {
  159.  
  160.     return ((u_int) ftell((FILE *)xdrs->x_private));
  161. }
  162.  
  163. static bool_t
  164. xdrstdio_setpos(xdrs, pos) 
  165.     XDR *xdrs;
  166.     u_int pos;
  167.  
  168.     return ((fseek((FILE *)xdrs->x_private, (long)pos, 0) < 0) ?
  169.         FALSE : TRUE);
  170. }
  171.  
  172. static long *
  173. xdrstdio_inline(xdrs, len)
  174.     XDR *xdrs;
  175.     u_int len;
  176. {
  177.  
  178.     /*
  179.      * Must do some work to implement this: must insure
  180.      * enough data in the underlying stdio buffer,
  181.      * that the buffer is aligned so that we can indirect through a
  182.      * long *, and stuff this pointer in xdrs->x_buf.  Doing
  183.      * a fread or fwrite to a scratch buffer would defeat
  184.      * most of the gains to be had here and require storage
  185.      * management on this buffer, so we don't do this.
  186.      */
  187.     return (NULL);
  188. }
  189.